﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace view
{
    class BoatCommands
    {
        private string exitLetter = "q";
        private model.BoatCommands _boatCommands;

        public BoatCommands()
        {
            _boatCommands = new model.BoatCommands();
        }

        internal model.BoatCommands BoatCommands1
        {
            get
            {
                throw new System.NotImplementedException();
            }
            set
            {
            }
        }

        public void showAllBoats() {
            List<model.Boat> boats = _boatCommands.getAllBoats();
            Console.WriteLine("Samtliga båtar:");
            foreach (var boat in boats)
            {
                Console.WriteLine("");
            }
        }

        public model.Boat updateBoat(model.Boat oldBoat)
        {
            Console.Clear();
            Console.WriteLine("Uppdatera båt:");
            Console.WriteLine("Nuvarande namn: {0} \nNuvarande båttyp: {1} \nNuvarande längd: {2}",
                oldBoat.boatName, oldBoat.boatType, oldBoat.length);
            string input;
            Console.Write("Ange nytt namn, eller retur för oförändrat: ");
            input = Console.ReadLine();
            if (!String.IsNullOrWhiteSpace(input))
            {
                oldBoat.boatName= input;
            }
            oldBoat.boatType = getBoatType("Ange ny båttyp: ");
            oldBoat.length = getInputDouble("Ange ny båtlängd: ");
            return oldBoat;
        }


        public model.Boat getBoat()
        {
            Console.Clear();
            Console.WriteLine("Välj en båt, eller '" + exitLetter + "' för att avbryta: ");
            return getBoatFromDB();
        }

        private model.Boat getBoatFromDB()
        {
            List<model.Boat> boats = _boatCommands.getAllBoats();
            foreach (var boat in boats)
            {
                Console.WriteLine(String.Format("BåtId: {0}, Båtnamn: {1}, Båttyp: {2}, Båtlängd: {3}, Ägare: {4}",
                    boat.boatId, boat.boatName, boat.boatType, boat.length, boat.Member.name));
            }
            string input;
            int output;
            do
            {
                Console.Write("Ange BåtId: ");
                input = Console.ReadLine();
                if (input.ToLower() == exitLetter)
                {
                    throw new FormatException("The user aborted");
                }
                //Kontrollera så att båtid't finns i listan.
                if (int.TryParse(input, out output) && boats.Any(x => x.boatId == output))
                {
                    var returnValue = from returnBoat in boats
                                      where returnBoat.boatId == output
                                      select returnBoat;
                    return returnValue.Single();
                }
                else
                {
                    Console.WriteLine("FEL! Du måste ange ett giltigt BåtId.");
                }
            } while (true);
        }


        public model.Boat getNewBoat() {
            Console.WriteLine("Skapa ny båt:");
            model.Boat boat = new model.Boat();
            boat.boatName = getInputString("Ange namn på båten: ");
            boat.boatType = getBoatType("Ange typ av båt: ");
            boat.length = getInputDouble("Ange längd på båten: ");
            return boat;
        }

        private string getInputString(string message)
        {
            string input;
            do
            {
                Console.Write(message);
                input = Console.ReadLine();
                if (!String.IsNullOrWhiteSpace(input))
                {
                    return input;
                }
                else
                {
                    Console.WriteLine("FEL! Tom inmatning.");
                }
            } while (true);
        }

        private model.BoatType getBoatType(string message)
        {
            string input;
            do
            {
                Console.Write(message);
                Console.WriteLine("Båttyper:");
                var i = 1;
                foreach (model.BoatType boatType in Enum.GetValues(typeof(model.BoatType)))
                {
                    Console.WriteLine(i + ": " + boatType);
                    i++;
                }
                input = Console.ReadLine();
                try
                {
                    model.BoatType boatType = (model.BoatType)Enum.Parse(typeof(model.BoatType), input);
                    return boatType;
                }
                catch (ArgumentException)
                {
                    Console.WriteLine("'{0}' är inte en giltig båttyp", input);
                }
            } while (true);
        }

        private double getInputDouble(string message)
        {
            string input;
            double output;
            do
            {
                Console.Write(message);
                input = Console.ReadLine();
                if (double.TryParse(input, out output) && output > 0)
                {
                    return output;
                }
                else
                {
                    Console.WriteLine("FEL! Du måste ange ett positivt tal.");
                }
            } while (true);
        }

        public void removeBoatSuccess() {
            Console.Clear();
            Console.WriteLine("Båten raderades.");
        }


        internal void updateBoatSuccess()
        {
            Console.Clear();
            Console.WriteLine("Båten uppdaterades.");
        }

        internal void registerBoatSuccess()
        {
            Console.Clear();
            Console.WriteLine("Båten registrerades.");
        }
    }
}
